﻿using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PharmacyBussinesEntities;

namespace PharmacyRepositoy
{
    public class VentaRepository : MasterRepository, IVentaRepository
    {

        public IEnumerable<Venta> GetVentasByCriterio(string criterio)
        {
            var query = from p in Context.Ventas
                .Include("Cliente")
                select p;
            if (criterio!=null && criterio!=string.Empty)
            {
                query = from p in query
                        .Include("Cliente")
                    where p.Cliente.Nombres.ToUpper().Contains(criterio.ToUpper()) ||
                          p.Cliente.DNI.ToUpper().Contains(criterio.ToUpper())
                    select p;
            }
            return query.ToList();
        }

        public Venta getVentaById(int id)
        {
            var query = from p in Context.Ventas
                .Include("Cliente")
                where p.Id.Equals(id)
                select p;
            return query.SingleOrDefault();
        }

        public void AddVenta(Venta venta)
        {
            var newVenta = new Venta();
            newVenta.IdCliente = venta.IdCliente;
            newVenta.FechaVenta = venta.FechaVenta;
            newVenta.Total = venta.Total;

            foreach (var item in venta.DetalleVenta)
            {
                var detalle = new DetalleVenta();
                detalle.Cantidad = item.Cantidad;
                detalle.IdLote = item.IdLote;
                
                detalle.PrecioUnit = item.PrecioUnit;

                newVenta.DetalleVenta.Add(detalle);
            }

            Context.Ventas.Add(newVenta);
            Context.SaveChanges();


        }

        public void UpdateVenta(Venta venta)
        {
            var ventaDB = getVentaById(venta.Id);

            ventaDB.FechaVenta = venta.FechaVenta;
            ventaDB.Total = venta.Total;
            
            if (ventaDB.IdCliente != venta.IdCliente)
            {
                ventaDB.IdCliente = venta.IdCliente;
                ventaDB.Cliente = venta.Cliente;
                Context.Entry(ventaDB.Cliente).State = EntityState.Unchanged;
            }

            var DetallesEliminados = new List<DetalleVenta>();

            foreach (var detalleBD in ventaDB.DetalleVenta)
            {
                var eliminado = venta.DetalleVenta.Where(dp => dp.Item == detalleBD.Item).SingleOrDefault();

                if (eliminado ==null)
                {
                    DetallesEliminados.Add(detalleBD);
                }
            }

            foreach (var detEliminado in DetallesEliminados)
            {
                var eliminar = ventaDB.DetalleVenta.Where(dp => dp.Item == detEliminado.Item).SingleOrDefault();
                ventaDB.DetalleVenta.Remove(eliminar);
            }

            foreach (var detalle in venta.DetalleVenta)
            {
                if (detalle.Item ==0)
                {
                    Context.Entry(detalle.Lote).State = EntityState.Unchanged;
                    ventaDB.DetalleVenta.Add(detalle);
                }
                else
                {
                    var detalleDB = ventaDB.DetalleVenta.Where(dp => dp.Item == detalle.Item).SingleOrDefault();

                    detalleDB.Cantidad = detalle.Cantidad;
                    detalleDB.PrecioUnit = detalle.PrecioUnit;

                    Context.Entry(detalleDB.Lote).State = EntityState.Unchanged;
                    Context.Entry(detalleDB).State = EntityState.Modified;
                }
            }
            Context.Entry(ventaDB).State = EntityState.Modified;
            Context.SaveChanges();

        }

        public void RemoveVenta(int id)
        {
            var existe = Context.Ventas.Find(id);

            if (existe!=null)
            {
                Context.Ventas.Remove(existe);
                Context.SaveChanges();
            }
        }
    }
}
